home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 19 / CU Amiga Magazine's Super CD-ROM 19 (1998)(EMAP Images)(GB)[!][issue 1998-02].iso / CUCD / Programming / LEDA / incl / LEDA.020+881 / sortseq.h < prev    next >
C/C++ Source or Header  |  1994-08-05  |  7KB  |  185 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  3.1c
  4. +
  5. +
  6. +  sortseq.h
  7. +
  8. +
  9. +  Copyright (c) 1994  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15. #ifndef LEDA_SORTSEQ_H
  16. #define LEDA_SORTSEQ_H
  17.  
  18. /*
  19. #include <LEDA/impl/rs_tree.h>
  20. #define SEQ_DEF_IMPL rs_tree
  21. #define SEQ_BASE_IMPL bin_tree
  22. typedef rs_tree_item seq_item;
  23. */
  24.  
  25. #include <LEDA/impl/skiplist.h>
  26. #define SEQ_DEF_IMPL skiplist
  27. #define SEQ_BASE_IMPL skiplist
  28. typedef skiplist_item seq_item;
  29.  
  30.  
  31. template<class ktype, class itype>
  32.  
  33. class _CLASSTYPE sortseq : public virtual SEQ_DEF_IMPL {
  34.  
  35. int  int_type()              const { return INT_TYPE(ktype); }
  36. int  cmp(GenPtr x, GenPtr y) const
  37.                      { return compare(ACCESS(ktype,x),ACCESS(ktype,y)); }
  38. void clear_key(GenPtr& x)   const { Clear(ACCESS(ktype,x)); }
  39. void clear_inf(GenPtr& x)   const { Clear(ACCESS(itype,x)); }
  40. void copy_key(GenPtr& x)    const { x = Copy(ACCESS(ktype,x)); }
  41. void copy_inf(GenPtr& x)    const { x = Copy(ACCESS(itype,x)); }
  42. void print_key(GenPtr x)    const { Print(ACCESS(ktype,x),cout); }
  43. void print_inf(GenPtr x)    const { Print(ACCESS(itype,x),cout); }
  44.  
  45. public:
  46.  
  47. virtual ktype  key(seq_item it) const { return ACCESS(ktype,SEQ_DEF_IMPL::key(it)); }
  48. virtual itype  inf(seq_item it) const { return ACCESS(itype,SEQ_DEF_IMPL::inf(it)); } 
  49.  
  50. virtual seq_item lookup(ktype y) const { return SEQ_DEF_IMPL::lookup(Convert(y)); }
  51. virtual seq_item locate(ktype y) const { return SEQ_DEF_IMPL::locate(Convert(y)); }
  52. virtual seq_item locate_succ(ktype y) const { return SEQ_DEF_IMPL::locate_succ(Convert(y)); }
  53. virtual seq_item locate_pred(ktype y) const { return SEQ_DEF_IMPL::locate_pred(Convert(y)); }
  54.  
  55. virtual seq_item min() const { return SEQ_DEF_IMPL::min(); }
  56. virtual seq_item max() const { return SEQ_DEF_IMPL::max(); }
  57.  
  58. virtual seq_item succ(seq_item x) const { return SEQ_DEF_IMPL::succ(x); }
  59. virtual seq_item succ(ktype y) const { return locate_succ(y); }
  60.  
  61. virtual seq_item pred(seq_item x) const { return SEQ_DEF_IMPL::pred(x); }
  62. virtual seq_item pred(ktype y) const { return locate_pred(y); }
  63.  
  64. virtual seq_item insert(ktype y,itype x)
  65.                          { return SEQ_DEF_IMPL::insert(Convert(y),Convert(x)); } 
  66.  
  67. virtual seq_item insert_at(seq_item it,ktype y,itype x)
  68. { return SEQ_DEF_IMPL::insert_at_item(it,Convert(y),Convert(x)); } 
  69.  
  70. virtual int      size()  const { return SEQ_DEF_IMPL::size(); }
  71.  
  72. virtual bool     empty() const { return (size()==0) ? true : false; }
  73.  
  74. virtual void     clear() { SEQ_DEF_IMPL::clear(); }
  75.  
  76. virtual void reverse_items(seq_item a, seq_item b) { SEQ_DEF_IMPL::reverse_items(a,b); }
  77. virtual void flip_items(seq_item a, seq_item b)    { reverse_items(a,b); }
  78.  
  79. virtual void del(ktype y)         { SEQ_DEF_IMPL::del(Convert(y)); } 
  80. virtual void del_item(seq_item it)  { SEQ_DEF_IMPL::del_item(it); } 
  81. virtual void change_inf(seq_item it, itype i) { SEQ_DEF_IMPL::change_inf(it,Convert(i));}
  82. virtual void split(seq_item x,sortseq<ktype,itype>& S1,sortseq<ktype,itype>& S2)
  83.                       { SEQ_DEF_IMPL::split_at_item(x,(SEQ_DEF_IMPL&)S1,(SEQ_DEF_IMPL&)S2); }
  84.  
  85. virtual sortseq<ktype,itype>& conc(sortseq<ktype,itype>& S) { SEQ_DEF_IMPL::conc((SEQ_DEF_IMPL&)S); return *this; }
  86.  
  87. sortseq()    {}
  88. sortseq(const sortseq<ktype,itype>& w) : SEQ_BASE_IMPL(w) {}
  89.  
  90. sortseq<ktype,itype>& operator=(const sortseq<ktype,itype>& w)
  91. { SEQ_DEF_IMPL::operator=(w); return *this; }
  92.  
  93. virtual ~sortseq()   { clear(); }
  94. };
  95.  
  96.  
  97.  
  98. //------------------------------------------------------------------------------
  99. //
  100. // Sorted sequences with implementation parameter:
  101. //
  102. //   _sortseq<ktype,itype,seq_impl> 
  103. //
  104. //------------------------------------------------------------------------------
  105.  
  106. #define _sortseq_class(ktype,itype,impl)\
  107. \
  108. class _CLASSTYPE _sortseq_class_(ktype,itype,impl) : private virtual impl, public sortseq<ktype,itype>\
  109. {\
  110. int int_type() const { return INT_TYPE(ktype); }\
  111. \
  112. int cmp(GenPtr x, GenPtr y) const\
  113. { return compare(ACCESS(ktype,x),ACCESS(ktype,y)); }\
  114. void clear_key(GenPtr& x) const { Clear(ACCESS(ktype,x)); }\
  115. void clear_inf(GenPtr& x) const { Clear(ACCESS(itype,x)); }\
  116. void copy_key(GenPtr& x) const { x = Copy(ACCESS(ktype,x)); }\
  117. void copy_inf(GenPtr& x) const { x = Copy(ACCESS(itype,x)); }\
  118. void print_key(GenPtr x) const { Print(ACCESS(ktype,x),cout); }\
  119. void print_inf(GenPtr x) const { Print(ACCESS(itype,x),cout); }\
  120. \
  121. public:\
  122. \
  123. ktype key(seq_item it) const { return ACCESS(ktype,impl::key(impl::item(it))); }\
  124. itype inf(seq_item it) const { return ACCESS(itype,impl::inf(impl::item(it))); }\
  125. \
  126. seq_item lookup(ktype y) const { return (seq_item)impl::lookup(Convert(y)); }\
  127. seq_item locate(ktype y) const { return (seq_item)impl::locate(Convert(y)); }\
  128. seq_item locate_succ(ktype y) const { return (seq_item)impl::locate_succ(Convert(y)); }\
  129. seq_item locate_pred(ktype y) const { return (seq_item)impl::locate_pred(Convert(y)); }\
  130. \
  131. seq_item min() const { return (seq_item)impl::min(); }\
  132. seq_item max() const { return (seq_item)impl::max(); }\
  133. \
  134. seq_item succ(seq_item x) const { return (seq_item)impl::succ(impl::item(x)); }\
  135. seq_item succ(ktype y) const { return locate_succ(y); }\
  136. \
  137. seq_item pred(seq_item x) const { return (seq_item)impl::pred(impl::item(x)); }\
  138. seq_item pred(ktype y) const { return locate_pred(y); }\
  139. \
  140. seq_item insert(ktype y,itype x)\
  141. { return (seq_item)impl::insert(Convert(y),Convert(x));}\
  142. \
  143. seq_item insert_at(seq_item it,ktype y,itype x)\
  144. { return (seq_item)impl::insert_at_item(impl::item(it),Convert(y),Convert(x));}\
  145. void reverse_items(seq_item a, seq_item b) { impl::reverse_items(impl::item(a),impl::item(b)); }\
  146. void flip_items(seq_item a, seq_item b) { reverse_items(a,b); }\
  147. \
  148. void del(ktype y) { impl::del(Convert(y)); }\
  149. void del_item(seq_item it) { impl::del_item(impl::item(it)); }\
  150. void change_inf(seq_item it, itype i) { impl::change_inf(impl::item(it),Convert(i));}\
  151. \
  152. int      size()  const { return impl::size(); }\
  153. bool     empty() const { return (size()==0) ? true : false; }\
  154. void     clear() { impl::clear(); }\
  155. \
  156. void split(seq_item it,sortseq<ktype,itype>& S1,sortseq<ktype,itype>& S2)\
  157. { impl::split_at_item(impl::item(it),*(impl*)&S1,*(impl*)&S2); }\
  158. \
  159. sortseq<ktype,itype>& conc(sortseq<ktype,itype>& S)\
  160. { impl::conc(*(impl*)&S); return *this; }\
  161. \
  162. _sortseq_class_(ktype,itype,impl)() {}\
  163. _sortseq_class_(ktype,itype,impl)(const _sortseq_(ktype,itype,impl)& S) : impl(S) {}\
  164. \
  165. _sortseq_(ktype,itype,impl)& operator=(const _sortseq_(ktype,itype,impl)& S)\
  166. { impl::operator=(S); return *this; }\
  167. \
  168. ~_sortseq_class_(ktype,itype,impl)() { impl::clear(); }
  169.  
  170. #if defined(__TEMPLATE_ARGS_AS_BASE__)
  171. #define _sortseq_class_(a,b,c) _sortseq
  172. #define _sortseq_(a,b,c) _sortseq<a,b,c>
  173. template <class ktype, class itype, class impl> 
  174. _sortseq_class(ktype,itype,impl)
  175. };
  176. #else
  177. #define _sortseq(a,b,c)         name4(a,b,c,_sortseq)
  178. #define _sortseq_class_(a,b,c)  name4(a,b,c,_sortseq)
  179. #define _sortseq_(a,b,c)        name4(a,b,c,_sortseq)
  180. #define _sortseqdeclare3(_a,_b,_c) _sortseq_class(_a,_b,_c) };
  181. #endif
  182.  
  183. #endif
  184.